#ifndef _OBJECT_H_
#define _OBJECT_H_

//#include <GL/glew.h>

#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>
#include <QtOpenGL/qgl.h>

#include <vector>
#include "Vertex.h"
#include "Box.h"
#include "Face.h"
#include "MaterialLib.h"

using namespace std;

enum RenderMode {IMMEDIAT, VA, VBO};

const int NUM_VERTEX = 3;

// Object - permet representar un objecte 3D
class Object
{
 public:
  Object(std::string);
  ~Object();

  // llegeix un model en format OBJ
  void readObj(const char* filename, MaterialLib& matlib);

  // calcula la capsa del model
  void updateBoundingBox();
  void updateVA();
  void updateVBO();

  // retorna la capsa del model (previament s'ha d'haver calculat)
  Box boundingBox() const;

  //Inicialitza objectes d'openGL
  void initGL();

  void render(RenderMode mode);
  void updateNormals();

  Point getCenter();


 private:
  void make_face ( char **words, int nwords, int material );
  void clear ();
  float getS(Vertex v);
  float getT(Vertex v);

 public:
  vector<Vertex> vertices;  // vector amb els vertexs de l'objecte
  vector<Face> faces;       // vector amb les cares de l'objecte
  GLfloat* va_vertices;
  GLuint* va_indices;
  GLfloat* va_normals;
  GLfloat* va_texCoord;
  GLfloat* va_colors;

  GLuint vbo_vertices_id;
  GLuint vbo_indices_id;

 private: 
  std::string name;
  Box _boundingBox;   // caixa contenidora de l'objecte.
  Point* center;
};


#endif
